WebRequest

La funzione invia una richiesta HTTP ad un server specificato. La funzione ha due versioni:

1. Invio richieste semplici di tipo "key=value" usando l'header Content-Type: application/x-www-form-urlencoded.

int  WebRequest(
   const string      method,           // metodo HTTP
   const string      url,              // URL
   const string      cookie,           // cookie
   const string      referer,          // referer
   int               timeout,          // timeout
   const char        &data[],          // l'array del corpo del messaggio HTTP
   int               data_size,        // grandezza array data[] in bytes
   char              &result[],        // un array contenente i dati di risposta del server
   string            &result_headers   // headers della risposta del server
   );

2. Invio di una richiesta di qualunque tipo specificando il personalizzato set di headers per una interazione più flessibile con vari servizi Web.

int  WebRequest(
   const string      method,           // metodo HTTP
   const string      url,              // URL
   const string      headers,          // headers 
   int               timeout,          // timeout
   const char        &data[],          // l'array del corpo del messaggio HTTP
   char              &result[],        // un array contenente i dati di risposta del server
   string            &result_headers   // headers della risposta del server
   );

Parametri

metodo

[in] metodo HTTP.

url

[in]  URL.

headers

[in] Richiedi intestazioni di tipo "chiave: valore", separate da un'interruzione di riga "\\ r \\ n".

cookie

[in] Valore del cookie.

referente

[in] Valore dell'intestazione Referer della richiesta HTTP.

timeout

[in] Timeout in millisecondi.

data[]

[in] Array di dati del corpo del messaggio HTTP.

data_size

[in] Dimensione dell'array di dati[].

result[]

[out] Un array contenente dati di risposta del server.

result_headers

[out] Intestazioni di risposta del server.

Valore restituito

Codice di risposta del server HTTP o -1 per un errore.

Nota

Per utilizzare la funzione WebRequest(), aggiungere gli indirizzi dei server richiesti nell'elenco di URL consentiti nella scheda "Expert Advisors" della finestra "Opzioni". La porta del server viene selezionata automaticamente sulla base del protocollo specificato - 80 per "http://" e 443 per "https://".

La funzione WebRequest() è sincrona, il che significa che interrompe l'esecuzione del programma e attende la risposta dal server richiesto. Poiché i ritardi nella ricezione di una risposta possono essere elevati, la funzione non è disponibile per le chiamate dagli indicatori, poiché gli indicatori vengono eseguiti in un thread comune condiviso da tutti gli indicatori e charts su un unico simbolo. Il ritardo delle prestazioni dell'indicatore su uno dei charts di un simbolo può interrompere l'aggiornamento di tutti i charts dello stesso simbolo.

La funzione può essere chiamata solo da Expert Advisors e script, poiché vengono eseguiti nei relativi thread di esecuzione. Se provi a chiamare la funzione da un indicatore, GetLastError() restituirà l'errore 4014 - "Funzione non consentita".

WebRequest() non può essere eseguito nel Tester di strategia.

Esempio:

void OnStart()
  {
   string cookie=NULL,headers;
   char   post[],result[];
   string url="https://finance.yahoo.com";
//--- Per abilitare l'accesso al server, è necessario aggiungere l'URL "https://finance.yahoo.com"
//--- alla lista di URL consentiti (Main Menu->Tools->Options, scheda "Expert Advisors"):
// --- Reimpostazione dell'ultimo codice di errore
   ResetLastError();
// --- Download di una pagina html da Yahoo Finance
   int res=WebRequest("GET",url,cookie,NULL,500,post,0,result,headers);
   if(res==-1)
     {
      Print("Errore in WebRequest. Error code  =",GetLastError());
      //--- Forse l'URL non è elencato, mostra un messaggio sulla necessità di aggiungere l'indirizzo
      MessageBox("Aggiungi l'indirizzo ' "+url+" ' alla lista di URL consentiti sulla scheda 'Expert Advisors' ","Error",MB_ICONINFORMATION);
     }
   else
     {
      if(res==200)
        {
         //--- Download riuscito
         PrintFormat("Il file è stato scaricato con successo, Dimensione File %d byte.",ArraySize(result));
         //PrintFormat("Server headers: %s",headers);
         //--- Salvataggio dati in un file
         int filehandle=FileOpen("url.htm",FILE_WRITE|FILE_BIN);
         if(filehandle!=INVALID_HANDLE)
           {
            //--- Salvataggio contenuto dell'array result[] in un file
            FileWriteArray(filehandle,result,0,ArraySize(result));
            //--- Chiusura file
            FileClose(filehandle);
           }
         else
            Print("Errore in FileOpen. Error code =",GetLastError());
        }
      else
         PrintFormat("Downloading '%s' fallito, codice errore %d",url,res);
     }
  }